package org.moonlight.jvm.classfile.attribute;

import org.moonlight.jvm.classfile.ClassReader;
import org.moonlight.jvm.classfile.constant.StaticConstantPool;

/**
 * Signature属性负责记录泛型签名信息。任何类、接口、构造器方法或字段的声明如果包含了类型变量（type variable）或参数化类型，则Signature属性会为它记录泛型签名信息。
 * 签名有助于实现反射、调试以及编译，现在Java的反射API能够获取到泛型类型，最终的数据来源就是这个属性。其结构定义如下:
 *   Signature_attribute {
 *       u2 attribute_name_index;
 *       u4 attribute_length;
 *       u2 signature_index;
 *   }
 *
 * @author Moonlight
 * @createTime 2023/8/15 17:53
 **/
public class SignatureAttribute implements AttributeInfo {

    private final StaticConstantPool scp;
    private int signatureIdx;

    public SignatureAttribute(StaticConstantPool scp) {
        this.scp = scp;
    }

    @Override
    public void readInfo(ClassReader reader) {
        this.signatureIdx = reader.readUint16();
    }

    public String signature() {
        return this.scp.getUtf8(this.signatureIdx);
    }

}
